/**   
 * @Title: LoginActivity.java 
 * @Package cn.edu.cdtu.healthclient.activity 
 * @Description: TODO 
 * @author 
 * @date 
 * @version V0.0   
 */
package cn.edu.cdtu.healthclient.activity;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import cn.edu.cdtu.healthclient.connect.ConnectForLogin;
import cn.edu.cdtu.healthclient.domain.LoginJson;
import cn.edu.cdtu.healthclient.service.HealthService;
import cn.edu.cdtu.healthclient.service.HealthService.HealthBinder;
import cn.edu.cdtu.healthclient.task.ActivityTaskQueue;
import cn.edu.scu.healthclient.activity.R;

/** 
 * @ClassName: LoginActivity 
 * @Description: 登录界面。
 * @author 
 * @date 
 *  
 */
public class LoginActivity extends Activity {
	/*
	 * 登陆成功的UserInformation存储在后台的对象名
	 */
	public static final String LOGIN_USER_OBJECT_NAME_STRING = "LoginUser";
	/*
	 * 
	 */
	private ActivityTaskQueue taskQueue;
	public ActivityTaskQueue getTaskQueue(){
		return taskQueue;
	}
	/*
	 * binder 负责登录模块和连接服务器的Service之间的通信任务。当登录模块要验证用户的身份时，
	 *        通过binder联系Service服务，service服务联系数据库，并将结果返回给登录模块。
	 */
	private HealthBinder binder;
	public HealthBinder getBinder(){
		return binder;
	}
	/*
	 * 登录模块和Service服务之间的连接设置。
	 */
	private ServiceConnection serviceConnection = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			binder = null;
			taskQueue.shutdownTaskQueue();
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			binder = (HealthBinder)service;
			if(!taskQueue.isRunning()){
				taskQueue.start();
			}
			if(binder.getAttribute(
					LoginActivity.LOGIN_USER_OBJECT_NAME_STRING) != null){
				Intent mainIntent=new Intent(LoginActivity.this,MainActivity.class);
				mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				finish();
    			startActivity(mainIntent);
			}
		}
	};
	/*
	 * 实例化一个Intent对象，该对象负责启动Service后台服务。
	 */
	private final Intent serviceIntent = new Intent(HealthService.ACTION);
	
	//登录界面中的组件。
	private EditText account;
	private EditText password;
	private Button login;
	private Button register;
	
	private ImageView closeTextButtonA,closeTextButtonB;
	//private Button register;
	
	/*
	 * (non-Javadoc)
	 * <p>Title: onCreate</p> 
	 * <p>Description: </p> 
	 * @param savedInstanceState 
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{		
		//启动Service后台服务。
		startService(serviceIntent);
		//实例化一个Activity任务序列。
		taskQueue = new ActivityTaskQueue();

		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login_interface_test);
		//登录界面的组件注册.
		//用户
		account=(EditText)findViewById(R.id.account);
		//密码
	    password=(EditText)findViewById(R.id.password);
	    //登录按钮
	    login=(Button)findViewById(R.id.login);
	    //注册按钮
	    register=(Button)findViewById(R.id.register);
	    
	    closeTextButtonA = (ImageView) findViewById(R.id.close_text_button_a);
	    
		closeTextButtonB = (ImageView) findViewById(R.id.close_text_button_b);
		
        closeTextButtonA.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(closeTextButtonA.isSelected()){
					account.setText("");
					closeTextButtonA.setSelected(false);
				}
			}
		});
        
       closeTextButtonB.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(closeTextButtonB.isSelected()){
					password.setText("");
					closeTextButtonB.setSelected(false);
				}
			}
		});
       
       account.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				closeTextButtonA.setSelected(true);
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		});
		
       password.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				closeTextButtonB.setSelected(true);
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		});

	    
	    //当用户点击登录后的程序逻辑.
	    login.setOnClickListener
        (
        	new OnClickListener()
        	{
        		/*
        		 * (non-Javadoc)
        		 * <p>Title: onClick</p> 
        		 * <p>Description: </p> 
        		 * @param viwe 
        		 * @see android.view.View.OnClickListener#onClick(android.view.View)
        		 */
        		@Override
        		public void onClick(View viwe)
        		{
        			//实例化一个异步线程，负责在后台与服务器的数据库连接，防止因访问服务器的原因而引起APP阻塞。
        			final LoginAsyncTask loginAsyncTask = new LoginAsyncTask();
        			//获取用户名
        			final String accountString = account.getText().toString();
        			//获取用户密码
        			final String passwordString = password.getText().toString();
        			//由任务队列启动新的线程来启动异步任务检测用户信息
        			taskQueue.addTask(new Thread(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							//调用异步任务传入用户数据进行检测。
							loginAsyncTask.execute(accountString,passwordString);
						}
					}));
        		}
        	}
        );
	    //当用户点击注册按钮后跳转至注册界面。
	    register.setOnClickListener
	    (
	    	new OnClickListener()
	    	{
	    		public void onClick(View viwe)
	    		{
	    			Intent registerIntent=new Intent(LoginActivity.this,RegisterActivity.class);
	    			startActivity(registerIntent);
	    		}
	    	}
	    );
	    
        
	}

	/* (non-Javadoc)
	 * <p>Title: onStart</p> 
	 * <p>Description: </p>  
	 * @see android.app.Activity#onStart()
	 */
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		//当登录界面一启动就为登录模块绑定一个Service服务，该服务负责联系服务器上的数据库。
		bindService(serviceIntent, serviceConnection, Service.BIND_AUTO_CREATE);
		super.onStart();
	}

	/* (non-Javadoc)
	 * <p>Title: onStop</p> 
	 * <p>Description: </p>  
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		//当登录Activity运行在后台时，解除对Service服务的绑定。
		super.onStop();
		unbindService(serviceConnection);
	}

	private long exitTime = 0;
	/* (non-Javadoc)
	 * <p>Title: onKeyDown</p> 
	 * <p>Description: 设置手机按键事件，当按下手机按键后提示用户。
	 * @param keyCode
	 * @param event
	 * @return 
	 * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){   
	        if((System.currentTimeMillis()-exitTime) > 2000){  
	            Toast.makeText(getApplicationContext(), "再按一次退出", 
	            		Toast.LENGTH_SHORT).show();                                
	            exitTime = System.currentTimeMillis();   
	        } else {
	            finish();
	            stopService(serviceIntent);
	            System.exit(0);
	        }
	        return true;   
	    }
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * 
	 * @ClassName: LoginAsyncTask 
	 * @Description: 登录异步任务的具体实现。
	 * @author 
	 * @date 
	 *
	 */
	private class LoginAsyncTask extends AsyncTask<String,Void,LoginJson>
    {
		
		
    	/* (non-Javadoc)
		 * <p>Title: doInBackground</p> 
		 * <p>Description: 异步任务的后台。该方法运行时，通过Service服务获取服务器里的数据，并返回获得的数据（
		 *                 数据是以JSON的格式返回）。
		 * @param params
		 * @return 
		 * @see android.os.AsyncTask#doInBackground(java.lang.Object[])
		 */
		@Override
		protected LoginJson doInBackground(String... params) {
			LoginJson loginJson=null;
    		try 
    		{
    			//从服务器获得一个JSON数据。
    			loginJson=ConnectForLogin.connect(params[0],params[1],
    					binder.getHttpClient());
			}
    		catch (Exception e) 
			{
				e.printStackTrace();
			}
    		return loginJson;
		}

		/* (non-Javadoc)
		 * <p>Title: onPostExecute</p> 
		 * <p>Description: 异步任务顺利执行后调用的方法，及如果顺利获得了服务器的数据后执行该方法。
		 * @param result 
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */
		@Override
		protected void onPostExecute(LoginJson result) {
			super.onPostExecute(result);
			//如果状态正常，执行其中的语句。
			if(result.getStatus()==1)
    		{
				//提示用户 登录成功。
    			Toast.makeText(getApplicationContext(),result.getUserInformation().getAccount() + "登陆成功",Toast.LENGTH_SHORT).show();
    			//标记用户的身份。
    			binder.setAttribute(LOGIN_USER_OBJECT_NAME_STRING,result.getUserInformation());
    			//登录成功后从登录界面跳转到主界面。
    			Intent mainIntent=new Intent(LoginActivity.this,MainActivity.class);
    			mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    			
    			LoginActivity.this.finish();
    			startActivity(mainIntent);
    		}
			//如果数据库中没有用户信息，则提示登录失败。
    		else
    		{
    			Toast.makeText(getApplicationContext(),"账号或者密码有误", Toast.LENGTH_LONG).show();
    		}
		}
    }
	
}
